// 202. 快乐数
// 「快乐数」 定义为：

// 对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
// 然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
// 如果这个过程 结果为 1，那么这个数就是快乐数。
// 如果 n 是 快乐数 就返回 true ；不是，则返回 false 。
// 输入：n = 19
// 输出：true
// 解释：
// 1^2 + 9^2 = 82
// 8^2 + 2^2 = 68
// 6^2 + 8^2 = 100
// 1^2 + 0^2 + 0^2 = 1
// 思路：用 set 记录是否发生重复
// getSum 函数，用来计算字符串的 每个位置上的数字平方和
/**
 * @param {number} n
 * @return {boolean}
 */
 var isHappy = function(n){
     // 求 字符串 的 数字平方和
     const getSum=(num)=>{
         let sum=0;
         while(num>0){
             sum+=(num%10)**2;
             num=Math.floor(num/10);
         }
         return sum;
     }
     // 用来记录是否无限循环
     const set=new Set();
     while(n!==1&&!set.has(n)){
         // 记录 每次的数字，用来判断是否发生循环
         set.add(n);
         n=getSum(n);
     }
     return n==1;
 }
//  258. 各位相加
// 给定一个非负整数 num，反复将各个位上的数字相加，直到结果为一位数。返回这个结果。
// 输入: num = 38
// 输出: 2 
// 解释: 各位相加的过程为：
// 38 --> 3 + 8 --> 11
// 11 --> 1 + 1 --> 2
// 由于 2 是一位数，所以返回 2。
// 思路：计算一个整数的各位相加的做法是，每次计算当前整数除以 10的余数得到最低位数，
// 将最低位数加到总和中，然后将当前整数除以 10。重复上述操作直到当前整数变成 0，
// 此时的总和即为原整数各位相加的结果。


 /**
 * @param {number} num
 * @return {number}
 */
 var addDigits = function(num) {
    while (num >= 10) {
        let sum = 0;
        while (num > 0) {
            sum += num % 10;
            num = Math.floor(num / 10);
        }
        num = sum;
    }
    return num;
};

// 263. 丑数
// 丑数 就是只包含质因数 2、3 和 5 的正整数。

// 给你一个整数 n ，请你判断 n 是否为 丑数 。如果是，返回 true ；否则，返回 false 。
// 思路：数学模拟 对 nn 反复除以 2,3,5，直到 n 不再包含质因数 2,3,5。
// 若剩下的数等于 1，则说明 n 不包含其他质因数，是丑数；
// 否则，说明 n 包含其他质因数，不是丑数。

/**
 * @param {number} n
 * @return {boolean}
 */
var isUgly = function(n) {
    if (n <= 0) {
        return false;
    }
    const factors = [2, 3, 5];
    for (const factor of factors) {
        while (n % factor === 0) {
            n /= factor;
        }
    }
    return n == 1;
};
